﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using ProyectoSelva.Const;
using ProyectoSelva.Daos;
using EntitiesAndMappings.Entities;
using ProyectoSelva.Validate;

namespace ProyectoSelva.Forms.Mantenimiento
{
    public partial class FrmActualizarTrabajador : Form,IValidateForm
    {
        public Boolean CerroSinAccion { get; set; }

        private Trabajador trabajador;

        private Boolean _valido;

        public FrmActualizarTrabajador(Trabajador trabajador)
        {
            CerroSinAccion = false;
            InitializeComponent();
            _valido = true;
            this.trabajador = trabajador;
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            _valido = true;
            errorProvider.Clear();
            FormsAssert.AssertComboBoxSelected(cmbTipoDocumento, errorProvider, this);
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtNumeroDocumento, 8, errorProvider,this);
            FormsAssert.AssertTextBoxOnlyNumbers(txtNumeroDocumento, errorProvider, this); 
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtApellidos, 75, errorProvider, this);
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtNombres, 25, errorProvider, this);
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtDomicilio, 200, errorProvider, this);
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtUbigeo, 200, errorProvider, this);
            FormsAssert.AssertComboBoxSelected(cmbTipoDocumento, errorProvider, this);
            txtTelefonoFijo.Text = txtTelefonoFijo.Text.Trim();
            txtTelefonoCelular.Text = txtTelefonoCelular.Text.Trim();
            txtCorreoElectronico.Text = txtCorreoElectronico.Text.Trim();
            if (!string.IsNullOrEmpty(txtTelefonoFijo.Text))
            {
                FormsAssert.AssertTextBoxNotEmptyAndSize(txtTelefonoFijo, 20, errorProvider, this);
                FormsAssert.AssertTextBoxOnlyNumbers(txtTelefonoFijo, errorProvider, this);
            }
            if (!string.IsNullOrEmpty(txtTelefonoCelular.Text))
            {
                FormsAssert.AssertTextBoxNotEmptyAndSize(txtTelefonoCelular, 20, errorProvider, this);
                FormsAssert.AssertTextBoxOnlyNumbers(txtTelefonoCelular, errorProvider, this);
            }
            if (!string.IsNullOrEmpty(txtCorreoElectronico.Text))
            {
                FormsAssert.AssertTextBoxNotEmptyAndSize(txtCorreoElectronico, 100, errorProvider, this);
                FormsAssert.AssertTextBoxEmail(txtCorreoElectronico, errorProvider, this);
            }
            ActionExecutor.Execute(this, delegate
            {
                trabajador.TipoDocumento = (TipoDocumento)cmbTipoDocumento.SelectedItem;
                trabajador.NivelEstudios = (NivelEstudios)cmbEstudiosAlcanzados.SelectedItem;
                trabajador.Codigo = trabajador.TipoDocumento.Codigo + txtNumeroDocumento.Text;
                trabajador.NumeroDocumento = txtNumeroDocumento.Text;
                trabajador.Apellidos = txtApellidos.Text;
                trabajador.Nombres = txtNombres.Text;
                trabajador.FechaIngreso = datFechaIngreso.Value;
                trabajador.Domicilio = txtDomicilio.Text;
                trabajador.FechaNacimiento = datFechaNacimiento.Value;
                trabajador.Ubigeo = txtUbigeo.Text;
                trabajador.AsignacionFamiliar = checkAsignacionFamiliar.Checked;
                trabajador.TelefonoFijo = txtTelefonoFijo.Text;
                trabajador.TelefonoCelular = txtTelefonoCelular.Text;
                trabajador.CorreoElectronico = txtCorreoElectronico.Text;
                if (trabajador.Id == 0)
                {
                    trabajador.Estado = Estado.Activo;
                }
                var trabajadorDao = new TrabajadorDAO();
                trabajador = trabajadorDao.Actualizar(trabajador);
                Close();
            });
            
        }
        
        private void FrmActualizarTrabajador_Load(object sender, EventArgs e)
        {
            lblValorCodigo.Text = trabajador.Codigo;
            txtNumeroDocumento.Text = trabajador.NumeroDocumento;
            _valido = true;
            ActionExecutor.Execute(this, delegate
            {
                var tipoDocumentoDAO = new EntidadGenericaDAO<TipoDocumento>();
                var listado = tipoDocumentoDAO.ListarTodos();
                cmbTipoDocumento.DataSource = listado;
                cmbTipoDocumento.SelectedIndex = GetIndiceTipoDocumento(listado);
            });
            ActionExecutor.Execute(this, delegate
            {
                var nivelEstudiosDAO = new EntidadGenericaDAO<NivelEstudios>();
                var listado = nivelEstudiosDAO.ListarTodos();
                cmbEstudiosAlcanzados.DataSource = listado;
                cmbEstudiosAlcanzados.SelectedIndex = GetIndiceNivelEstudio(listado);
            });
            txtNombres.Text = trabajador.Nombres;
            txtDomicilio.Text = trabajador.Domicilio;
            txtApellidos.Text = trabajador.Apellidos;
            datFechaIngreso.Value = (trabajador.FechaIngreso.Equals(DateTime.MinValue) ? DateTime.Now : trabajador.FechaIngreso);
            datFechaNacimiento.Value = (trabajador.FechaNacimiento.Equals(DateTime.MinValue) ? DateTime.Now : trabajador.FechaNacimiento);
            txtUbigeo.Text = trabajador.Ubigeo;
            checkAsignacionFamiliar.Checked = trabajador.AsignacionFamiliar;
            txtTelefonoFijo.Text = trabajador.TelefonoFijo;
            txtTelefonoCelular.Text = trabajador.TelefonoCelular;
            txtCorreoElectronico.Text = trabajador.CorreoElectronico;
        }

        private int GetIndiceNivelEstudio(IList<NivelEstudios> listado)
        {
            var indice = 0;
            if (trabajador.NivelEstudios != null)
            {
                while (!listado[indice].Id.Equals(trabajador.NivelEstudios.Id))
                {
                    indice++;
                }
            }
            return indice;
        }

        private int GetIndiceTipoDocumento(IList<TipoDocumento> listado)
        {
            var indice = 0;
            if (trabajador.TipoDocumento != null)
            {
                while (!listado[indice].Id.Equals(trabajador.TipoDocumento.Id))
                {
                    indice++;
                }
            }
            return indice;
        }


        public void Invalid()
        {
            _valido = false;
        }

        public Boolean IsValid()
        {
            return _valido;
        }

        private void FrmActualizarTrabajador_FormClosing(object sender, FormClosingEventArgs e)
        {
            CerroSinAccion = (trabajador.Id==0);
        }
    }
}
